{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Introduction\n",
    "----\n",
    "In this assignment, you will convert your batch least squares solution to a recursive one! Recall that you have the following data:\n",
    "\n",
    "| Current (A) | Voltage (V) |\n",
    "|-------------|-------------|\n",
    "| 0.2         | 1.23        |\n",
    "| 0.3         | 1.38        |\n",
    "| 0.4         | 2.06        |\n",
    "| 0.5         | 2.47        |\n",
    "| 0.6         | 3.17        |\n",
    "\n",
    "This time, you will be fitting a linear model which includes an offset, $y = Rx + b$. If Ohm's law ($V = RI$) holds, we expect this offset to be near zero.\n",
    "\n",
    "You will set the initial parameters with the assumption that your prior estimate of the resistance $R = 4$ is not very good. Also, since you are fairly certain that Ohm's law ($V = RI$) does, in fact, hold, it is safe to assume with high confidence that the offset term $b$ will be close to zero. Initialize the estimator as follows:\n",
    "\n",
    "$$\\hat{R} \\sim \\mathcal{N}(4, 10.0), \\hat{b} \\sim \\mathcal{N}(0, 0.2)$$\n",
    "\n",
    "You can assume that we know the current perfectly, and that the voltage measurements are corrupted by additive, independent and identitically distributed Gaussian noise with variance $0.0225 ~ V^2$.\n",
    "\n",
    "## Getting Started\n",
    "----\n",
    "As before, load the current and voltge measurements into numpy arrays and plot the values:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from numpy.linalg import inv\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "I = np.array([0.2, 0.3, 0.4, 0.5, 0.6])\n",
    "V = np.array([1.23, 1.38, 2.06, 2.47, 3.17])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(I, V)\n",
    "\n",
    "plt.xlabel('current (A)')\n",
    "plt.ylabel('voltage (V)')\n",
    "plt.grid(True)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Estimating the Parameters\n",
    "----\n",
    "### Batch Estimator\n",
    "Before implementing recursive least squares, let's review the parameter estimate given by the batch least squares method used in the previous assignment. This time, you will be fitting a model which contains an offset $y = Rx + b$. We can use this result later for comparison."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The parameters of the line fit are ([R, b]):\n",
      "[4.97  0.074]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "## Batch Solution\n",
    "H = np.ones((5,2))\n",
    "H[:, 0] = I\n",
    "x_ls = inv(H.T.dot(H)).dot(H.T.dot(V))\n",
    "print('The parameters of the line fit are ([R, b]):')\n",
    "print(x_ls)\n",
    "\n",
    "#Plot\n",
    "I_line = np.arange(0, 0.8, 0.1)\n",
    "V_line = x_ls[0]*I_line + x_ls[1]\n",
    "\n",
    "plt.scatter(I, V)\n",
    "plt.plot(I_line, V_line)\n",
    "plt.xlabel('current (A)')\n",
    "plt.ylabel('voltage (V)')\n",
    "plt.grid(True)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As expected, the offset parameter $\\hat{b}$ is near zero, while $\\hat{R}$ closely approximates the true resistance value of $R = 5~\\Omega$."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Recursive Estimator\n",
    "Now try to implement the least squares method recursively! Recall the steps described in Module 1, Lesson 2 - \"Recursive Least Squares\": \n",
    "\n",
    "**Initialize the parameter and covariance estimates**:\n",
    "\n",
    "----\n",
    "$$\n",
    "\\hat{\\mathbf{x}}_0 = E\\left[\\mathbf{x}\\right] \\,\\,\\, , \\,\\,\\, \\mathbf{P}_0 = E\\left[(\\mathbf{x} - \\hat{\\mathbf{x}}_0)(\\mathbf{x} - \\hat{\\mathbf{x}}_0)^T\\right]\n",
    "$$\n",
    "\n",
    "**For every measurement k**:\n",
    "\n",
    "----\n",
    "  * Calculate the correction gain $$\\mathbf{K}_k = \\mathbf{P}_{k-1}\\mathbf{H}_k^T\\left(\\mathbf{H}_k\\mathbf{P}_{k-1}\\mathbf{H}_k^T + \\mathbf{R}_k\\right)^{-1}$$\n",
    "  * Update the parameter estimate $$\\hat{\\mathbf{x}}_k = \\hat{\\mathbf{x}}_{k-1} + \\mathbf{K}_k\\left(\\mathbf{y}_k - \\mathbf{H}_k\\hat{\\mathbf{x}}_{k-1}\\right)$$\n",
    "  * Update the covariance estimate $$\\mathbf{P}_k = \\left(\\mathbf{I} - \\mathbf{K}_k\\mathbf{H}_k\\right)\\mathbf{P}_{k-1}$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The parameters of the line fit are ([R, b]):\n",
      "[[4.9973107 ]\n",
      " [0.06168775]]\n"
     ]
    }
   ],
   "source": [
    "## Recursive solution\n",
    "\n",
    "#Initialize the 2x2 covaraince matrix\n",
    "P_k = np.zeros((2, 2))\n",
    "P_k[0][0] = 100\n",
    "P_k[1][1] = 0.04\n",
    "\n",
    "#Initialize the parameter estimate x\n",
    "x_k = np.zeros((2, 1))\n",
    "x_k[0][0] = 4\n",
    "x_k[1][0] = 0\n",
    "\n",
    "V = V.reshape(num_meas, 1)\n",
    "#Our measurement variance\n",
    "Var = 0.0225\n",
    "\n",
    "#Pre allocate our solutions so we can save the estimate at every step\n",
    "num_meas = I.shape[0]\n",
    "x_hist = np.zeros((num_meas + 1,2))\n",
    "P_hist = np.zeros((num_meas + 1,2,2))\n",
    "\n",
    "x_hist[0] = np.squeeze(x_k)\n",
    "P_hist[0] = np.squeeze(P_k)\n",
    "\n",
    "#Iterate over the measurements\n",
    "for k in range(num_meas):\n",
    "    #Construct H_k\n",
    "    H = np.ones((num_meas, 2))\n",
    "    H[:, 0] = I\n",
    "  \n",
    "    #Construct K_k\n",
    "    K_k = P_k.dot(H.T).dot(np.linalg.inv(H.dot(P_k).dot(H.T) + Var * np.identity(num_meas)))\n",
    "                    \n",
    "    #Update our estimate\n",
    "\n",
    "    \n",
    "    \n",
    "    x_k = x_k + K_k.dot(V - H.dot(x_k))\n",
    "        \n",
    "\n",
    "    #Update our uncertainty\n",
    "    P_k = (np.identity(2) - K_k.dot(H)).dot(P_k)\n",
    "\n",
    "    #Keep track of our history\n",
    "    \n",
    "    P_hist[k+1] = np.squeeze(P_k)\n",
    "    x_hist[k+1] = np.squeeze(x_k)\n",
    "    \n",
    "print('The parameters of the line fit are ([R, b]):')\n",
    "print(x_k)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Plotting the Results\n",
    "----\n",
    "Let's plot out the solutions at every step. Does the value converge towards the batch least squares solution from the previous assignment?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#Plot\n",
    "plt.scatter(I, V, label='Data')\n",
    "plt.plot(I_line, V_line, label='Batch Solution')\n",
    "plt.xlabel('current (A)')\n",
    "plt.ylabel('voltage (V)')\n",
    "plt.grid(True)\n",
    "\n",
    "I_line = np.arange(0, 0.8, 0.1)\n",
    "for k in range(0, num_meas):\n",
    "    V_line = x_hist[k,0]*I_line + x_hist[k,1]\n",
    "    plt.plot(I_line, V_line, label='Measurement {}'.format(k))\n",
    "\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The resistance estimate does approach the true resistance value of $R = 5~\\Omega$. Try modifying the initialization values (e.g., the intial uncertainty) - can you get a better final estimate?"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
